package fr.afcepf.projet.hebergeur.service.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import fr.afcepf.projet.hebergeur.dao.interfaces.IAbonnementDao;
import fr.afcepf.projet.hebergeur.dao.interfaces.IClientDao;
import fr.afcepf.projet.hebergeur.data.Abonnement;
import fr.afcepf.projet.hebergeur.data.Client;
import fr.afcepf.projet.hebergeur.data.Domaine;
import fr.afcepf.projet.hebergeur.data.Hebergement;
import fr.afcepf.projet.hebergeur.data.ServeurDedie;
import fr.afcepf.projet.hebergeur.dto.AbonnementDto;
import fr.afcepf.projet.hebergeur.dto.DomaineDto;
import fr.afcepf.projet.hebergeur.dto.HebergementDto;
import fr.afcepf.projet.hebergeur.dto.ServeurDedieDto;
import fr.afcepf.projet.hebergeur.exception.ServiceException;
import fr.afcepf.projet.hebergeur.service.interfaces.IServiceAbonnements;

@Service("serviceAbonnement")
@Transactional
public class ServiceAbonnementsImpl implements IServiceAbonnements {
	@Resource
	IAbonnementDao dao;
	@Autowired
	IClientDao daoCli;

	public IAbonnementDao getDao() {
		return dao;
	}

	public void setDao(IAbonnementDao dao) {
		this.dao = dao;
	}

	private AbonnementDto convertToDto(Abonnement abo) {
		AbonnementDto dto = null;
		if (abo instanceof Domaine) {
			dto = new DomaineDto();
		} else if (abo instanceof Hebergement) {
			dto = new HebergementDto();
		} else if (abo instanceof ServeurDedie) {
			dto = new ServeurDedieDto();
		}
		BeanUtils.copyProperties(abo, dto);
		return dto;
	}

	private Abonnement convertToEntity(AbonnementDto dto) {
		Abonnement abo = null;
		if (dto instanceof DomaineDto) {
			abo = new Domaine();
		} else if (dto instanceof HebergementDto) {
			abo = new Hebergement();
		} else if (dto instanceof ServeurDedieDto) {
			abo = new ServeurDedie();
		}
		Abonnement oldAbo = dao.getEntityByPrimaryKey(Abonnement.class,
				dto.getNumAbo());
		if (null == abo.getClient())
			abo.setClient(oldAbo.getClient());
		BeanUtils.copyProperties(dto, abo);
		return abo;
	}

	@Override
	public AbonnementDto getAboSelonNum(Long numAbo) throws ServiceException {
		Abonnement c = dao.getEntityByPrimaryKey(Abonnement.class, numAbo);
		return convertToDto(c);
	}

	@Override
	public Collection<AbonnementDto> getAboSelonNumClient(Long numCli)
			throws ServiceException {
		Collection<Abonnement> listeAbo = dao.getAboOfClient(numCli);
		Collection<AbonnementDto> listeAboDto = new ArrayList<AbonnementDto>();
		for (Abonnement c : listeAbo) {
			listeAboDto.add(convertToDto(c));
		}
		return listeAboDto;
	}

	@Override
	public boolean isNomDomaineValid(String nom) throws ServiceException {
		// TODO Auto-generated method stub
		return dao.isNomDomaineValid(nom);
	}

	@Override
	public boolean removeAbonnement(Long numAbo) throws ServiceException {
		dao.removeEntity(dao.getEntityByPrimaryKey(Abonnement.class, numAbo));
		return true;
	}

	@Override
	public void addAbonnementForClient(String typeAbo, Long numCli)
			throws ServiceException {
		/*
		if (typeAbo.equals(DomaineDto.class)) {
			String nDom = ((Domaine) abo).getNom();
			if (!isNomDomaineValid(nDom))
				throw new ServiceException(
						"Nous sommes desoles mais le nom de domaine : " + nDom
								+ " existe deja !");
		}
		*/
		Abonnement abo = null;
		try {
			abo = (Abonnement)Class.forName(typeAbo).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		abo.setClient(daoCli.getEntityByPrimaryKey(Client.class, numCli));
		abo = dao.persistNewEntity(abo);
		System.out.println("abo:" + abo);
	}

	@Override
	public boolean modifierAbonnement(List<AbonnementDto> abosDto) {
		for (AbonnementDto abonnementdto : abosDto) {
			Abonnement abo = convertToEntity(abonnementdto);
			dao.updateEntity(abo);
		}
		return true;
	}

}
